package main

import (
	"fmt"
	"strings"
)

func main() {

	changeString()

//强制类型转换的基本语法如下： T(表达式)
}

//修改字符串
func changeString()  {
	/*
		要修改字符串，需要先将其转换成[]rune或[]byte，完成后再转换为string。
		无论哪种转换，都会重新分配内存，并复制字节数组。
	 */
	s1 := "hello"

	// 强制类型转换
	byteS1 := []byte(s1)
	byteS1[0] = 'H'
	fmt.Println(string(byteS1))

	s2 := "博客"
	runeS2 := []rune(s2)
	runeS2[0] = '狗'
	fmt.Println(string(runeS2))
}

//操作字符串
func operatorString()  {

	str := "i am good boy"

	fmt.Println(len(str))

	fmt.Println(fmt.Sprintf("%s ? yes or not", str))

	strArr := strings.Split(str, " ")
	fmt.Printf("%v\n", strArr)
	for key, value := range strArr {
		fmt.Printf("%d => %s \n", key, value)
	}

	fmt.Println(strings.Contains(str, "boy"))
}

// 遍历字符串
func traversalString() {
	/*
		因为UTF8编码下一个中文汉字由3~4个字节组成，所以我们不能简单的按照字节去遍历一个包含中文的字符串，
			否则就会出现上面输出中第一行的结果。

		字符串底层是一个byte数组，所以可以和[]byte类型相互转换。字符串是不能修改的 字符串是由byte字节组成，
			所以字符串的长度是byte字节的长度。 rune类型用来表示utf8字符，一个rune字符由一个或多个byte组成。
	*/
	s := "pprof.cn博客"
	for i := 0; i < len(s); i++ { //byte
		fmt.Printf("%v(%c) ", s[i], s[i])
	}
	fmt.Println()
	for _, r := range s { //rune
		fmt.Printf("%v(%c) ", r, r)
	}
	fmt.Println()
}
